Aidemy NumPy基礎
NumPyを用いた数値計算
1次元配列
code: Python
import numpy as np
storages = 24, 3, 4, 23, 10, 12
print(storages)
np_storages = np.array(storages)
print(np_storages)
print(type(np_storages))
--------------------------------------------------------------------------
24, 3, 4, 23, 10, 12
24 3 4 23 10 12
<class 'numpy.ndarray'>
--------------------------------------------------------------------------
1次元配列の計算
code: Python
import numpy as np
arr = np.array(2, 5, 3, 4, 8)
# arr + arr
print(arr + arr)
# arr - arr
print(arr - arr)
# arr ** 3
print(arr ** 3)
# 1 / arr
print(1 / arr)
--------------------------------------------------------------------------
4 10 6 8 16
0 0 0 0 0
8 125 27 64 512
0.5 0.2 0.33333333 0.25 0.125
--------------------------------------------------------------------------
インデックス参照とスライス
code: Python
import numpy as np
arr = np.arange(10)
print(arr)
print(arr3:6)
arr3:6 = 24
print(arr)
--------------------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9
3 4 5
0 1 2 24 24 24 6 7 8 9
--------------------------------------------------------------------------
ndarrayの注意点
code:Python
import numpy as np
arr1 = np.array(1, 2, 3, 4, 5)
print(arr1)
arr2 = arr1
arr20 = 100
# 別の変数への変更が元の変数にも影響される.
print(arr1)
arr1 = np.array(1, 2, 3, 4, 5)
print(arr1)
arr2 = arr1.copy()
arr20 = 100
# 別の変数への変更が元の変数には影響を与えていない.
print(arr1)
--------------------------------------------------------------------------
1 2 3 4 5
100 2 3 4 5
1 2 3 4 5
1 2 3 4 5
--------------------------------------------------------------------------
viewとcopy
code: Python
import numpy as np
# Pythonのリストでスライスを用いた場合の挙動.
arr_List = x for x in range(10)
print("リスト型データです。")
print("arr_List:", arr_List)
print()
arr_List_copy = arr_List:
arr_List_copy0 = 100
print("リストのスライスではコピーが作られるので、arr_Listにはarr_List_copyの変更が反映されません。")
print("arr_List:", arr_List)
print()
# NumPyのndarrayでスライスを用いた場合での挙動.
arr_NumPy = np.arange(10)
print("NumPyのndarrayデータです")
print("arr_NumPy:", arr_NumPy)
print()
arr_NumPy_view = arr_NumPy:
arr_NumPy_view0 = 100
print("NumPyのスライスではビュー(データが格納されている場所の情報)が代入されるので、arr_NumPy_viewの変更がarr_NumPyに反映されます。")
print("arr_NumPy:", arr_NumPy)
print()
# NumPyのndarrayでcopy()を用いた場合での挙動.
arr_NumPy = np.arange(10)
print('NumPyのndarrayでcopy()を用いた場合での挙動です')
print("arr_NumPy:", arr_NumPy)
print()
arr_NumPy_copy = arr_NumPy:.copy()
arr_NumPy_copy0 = 100
print("copy()を用いた場合は、コピーが生成されているのでarr_NumPy_copyはarr_NumPyに影響を与えません。")
print("arr_NumPy:", arr_NumPy)
--------------------------------------------------------------------------
リスト型データです。
arr_List: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
リストのスライスではコピーが作られるので、arr_Listにはarr_List_copyの変更が反映されません。
arr_List: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
NumPyのndarrayデータです
arr_NumPy: 0 1 2 3 4 5 6 7 8 9
NumPyのスライスではビュー(データが格納されている場所の情報)が代入されるので、arr_NumPy_viewの変更がarr_NumPyに反映されます。
arr_NumPy: 100 1 2 3 4 5 6 7 8 9
NumPyのndarrayでcopy()を用いた場合での挙動です
arr_NumPy: 0 1 2 3 4 5 6 7 8 9
copy()を用いた場合は、コピーが生成されているのでarr_NumPy_copyはarr_NumPyに影響を与えません。
arr_NumPy: 0 1 2 3 4 5 6 7 8 9
--------------------------------------------------------------------------
ブールインデックス参照
code: Python
import numpy as np
arr = np.array(2, 3, 4, 5, 6, 7)
print(arr % 2 == 0)
print(arrarr % 2 == 0)
--------------------------------------------------------------------------
True False True False True False
2 4 6
--------------------------------------------------------------------------
ユニバーサル関数
code: Python
import numpy as np
arr = np.array(4, -9, 16, -4, 20)
print(arr)
arr_abs = np.abs(arr)
print(arr_abs)
print(np.exp(arr_abs))
print(np.sqrt(arr_abs))
--------------------------------------------------------------------------
4 -9 16 -4 20
4 9 16 4 20
[ 5.45981500e+01 8.10308393e+03 8.88611052e+06 5.45981500e+01
4.85165195e+08]
2. 3. 4. 2. 4.47213595
--------------------------------------------------------------------------
集合関数
code: Python
import numpy as np
arr1 = 2, 5, 7, 9, 5, 2
arr2 = 2, 5, 8, 3, 1
new_arr1 = np.unique(arr1)
print(new_arr1)
# 変数new_arr1と変数arr2の和集合
print(np.union1d(new_arr1, arr2))
# 変数new_arr1と変数arr2の積集合
print(np.intersect1d(new_arr1, arr2))
# 変数new_arr1から変数arr2を引いた差集合
print(np.setdiff1d(new_arr1, arr2))
--------------------------------------------------------------------------
2 5 7 9
1 2 3 5 7 8 9
2 5
7 9
--------------------------------------------------------------------------
乱数
code: Python
import numpy as np
from numpy.random import randint
arr1 = randint(0, 11, (5, 2))
print(arr1)
arr2 = np.random.rand(3)
print(arr2)
--------------------------------------------------------------------------
[ 0 4
3 7
2 5
10 8
1 6]
0.61282288 0.41927437 0.47701354
--------------------------------------------------------------------------
2次元配列
code: Python
import numpy as np
arr = np.array(1, 2, 3, 4], [5, 6, 7, 8)
print(arr)
# 変数arrの行列の各次元ごとの要素数
print(arr.shape)
# 変数arrを4行2列の行列に変換
print(arr.reshape(4, 2))
--------------------------------------------------------------------------
[1 2 3 4
5 6 7 8]
(2, 4)
[1 2
3 4
5 6
7 8]
--------------------------------------------------------------------------
インデックス参照とスライス
code:Python
import numpy as np
arr = np.array(1, 2, 3], 4, 5, 6, [7, 8, 9)
print(arr)
# 変数arrの要素のうち3を出力
print(arr0, 2)
# [4 5
# 7 8]
print(arr1:, 0:2)
--------------------------------------------------------------------------
[1 2 3
4 5 6
7 8 9]
3
[4 5
7 8]
--------------------------------------------------------------------------
axis
code: Python
import numpy as np
arr = np.array(1, 2, 3], 4, 5, 12, [15, 20, 22)
# arrの行の合計値
print(arr.sum(axis=1))
--------------------------------------------------------------------------
6 21 57
--------------------------------------------------------------------------
ファンシーインデックス参照
code: Python
import numpy as np
arr = np.arange(25).reshape(5, 5)
# 変数arrの行の順番を変更したものを出力
print(arr1, 3, 0)
--------------------------------------------------------------------------
[ 5 6 7 8 9
15 16 17 18 19
0 1 2 3 4]
--------------------------------------------------------------------------
転置行列
code: Python
import numpy as np
arr = np.arange(10).reshape(2, 5)
print(arr.T) or np.transpose(arr)
--------------------------------------------------------------------------
[0 5
1 6
2 7
3 8
4 9]
--------------------------------------------------------------------------
ソート
code: Python
import numpy as np
arr = np.array(8, 4, 2], [3, 5, 1)
# ソート後の配列番号を返す
print(arr.argsort())
print(np.sort(arr))
# 0を引数とすると列単位で要素がソートされ、1を引数にすると行単位で要素がソートされる
arr.sort(1)
print(arr)
--------------------------------------------------------------------------
[2 1 0
2 0 1]
[2 4 8
1 3 5]
[2 4 8
1 3 5]
--------------------------------------------------------------------------
行列計算
code: Python
import numpy as np
arr = np.arange(9).reshape(3, 3)
# 行列積を出力
print(np.dot(arr, arr))
vec = arr.reshape(9)
# ベクトルaとbのノルムを出力
# ノルム とは、ベクトルの長さを返すもので、要素の二乗値を足し合わせて、ルートを被せたもの
print(np.linalg.norm(vec))
--------------------------------------------------------------------------
[ 15 18 21
42 54 66
69 90 111]
14.2828568571
--------------------------------------------------------------------------
統計関数
code: Python
import numpy as np
arr = np.arange(15).reshape(3, 5)
# 列ごと平均
print(np.mean(arr, axis = 0))
# 行の合計
print(np.sum(arr, axis = 1))
# 最小値
print(np.min(arr))
# 列の最大値のインデックス番号
print(np.argmax(arr, axis = 0))
--------------------------------------------------------------------------
5. 6. 7. 8. 9.
10 35 60
0
2 2 2 2 2
--------------------------------------------------------------------------
ブロードキャスト
code: Python
# ブロードキャストは、 2つのndarray同士の演算時にサイズの小さい配列の行と列を自動で大きい配列に合わせる
import numpy as np
# 0から14の整数値をもつ3×5のndarray配列xを生成
x = np.arange(15).reshape(3, 5)
# 0から4の整数値をもつ1×5のndarray配列yを生成
y = np.array(np.arange(5))
# xのn番目の列のすべての要素に対してnだけ引く
z = x - y
# xを出力
print(z)
--------------------------------------------------------------------------
[ 0 0 0 0 0
5 5 5 5 5
10 10 10 10 10]
--------------------------------------------------------------------------